// 数组

// 1. 数组的定义

// 定义数组的两种方式：

// 方式一：new Array(1,2,3)
let arr1=new Array(1,2,3);
console.log(arr1);

// 方式二：[1,2,3]
let arr2=[1,2,3];
console.log(arr2);

// 2. 数组的读取

// 数组变量[下标]

console.log(arr2[1]);
console.log("arr2数组的长度：",arr2.length);

// 3. 数组的遍历

// ES6中数组的遍历方式

// for
// forEach
// map
// filter
// every
// some
// reduce

let arr=[1,2,4,5,6,8,2];

// for循环
for(let i=0;i<arr.length;i++){
    console.log(arr[i]);
}

// forEach()方法

// 注意: forEach 的代码块中不能使用 break、continue，它会抛出异常

arr.forEach(function(value,index,array){//index 下标 value 值 array 数组
    console.log(index,value,array);
})

// map() 方法：返回新的数组。
arr.map(function(value,index,array){ //index 下标 value 值
    console.log(index,value,array);
})

let resultArr1=arr.map(function(value){
    return value*value
})

console.log(arr,resultArr1);


// filter() 方法：返回新的数组，返回符合回调函数指定条件的元素数组。
let resultArr2=arr.filter(function(value){
    return value % 2 === 0;
})

console.log(arr,resultArr2);

// some() 方法：返回boolean，判断是否有元素符合回调函数条件

let result1=arr.some(function(value){
    return value === 2;
})

console.log(result1);

// every() 方法：返回boolean，判断每个元素是否符合回调函数条件
let result2=arr.every(function(value){
    return value % 2 === 0;
})

console.log(result2);

// reduce(func,[初始值]) 方法

// reduce 方法的第一参数也是一个回调函数，这个回调函数一共有4个参数，分别是：
// 1. prevValue: 上一次回调返回的值
// 2. currentValue：数组中当前被处理的元素
// 3. index：当前元素在数组中的索引
// 4. array：调用reduce的数组

// 例如：计算数组所有元素的和
let result=arr.reduce(function(prevValue,currentValue){
    console.log(prevValue,"上一次回调返回的值");
    console.log(currentValue,"数组中当前被处理的元素");
    return prevValue + currentValue
},0);

console.log(result);

// 例如：数组去重
let result4 =arr.reduce(function(prevValue,currentValue){
    prevValue.indexOf(currentValue)===-1&&prevValue.push(currentValue)
    return prevValue
},[])

console.log(arr,result4);

// ES6 中数组的遍历方式

let arr4=[1,2,3];

// find()

let res1=arr4.find(function(value){
    return value === 3;
})

console.log(arr4,res1);

// for...of 是支持break、continue、return 的，所以在功能上非常贴近原生的 for。

for(let value of arr4){
    console.log(value);
}

for(let value of arr4.values()){
    console.log(value);
}

for(let index of arr4.keys()){
    console.log(index);
}

for (let [index,value] of arr4.entries()){
    console.log(index,value);
}

// 数组的扩展

// 1.类数组/伪数组

// DOM
let divs=document.getElementsByTagName("div");
console.log(divs);//HTMLCollection []

let divs2=document.querySelectorAll(".xxx");
console.log(divs2);//NodeList []

// divs2.push(1)//Uncaught TypeError: divs2.push is not a function

//ES5
let divArr=Array.prototype.slice.call(divs2);
console.log(divArr);//[]

divArr.push(1,2);//添加成功 不报错
// console.log(divArr);

// 2. Array.from()
let arrayList={
    0:"es5",
    1:"es6",
    2:"es7",
    length: 3
};

console.log(arrayList);

// arrayList.push("es8");//Uncaught TypeError: arrayList.push is not a function

let arrayListNew=Array.from(arrayList)
console.log(arrayListNew);
arrayListNew.push("es8");
console.log(arrayListNew);//不报错 添加成功

// 3. Array.of()

let arr3=new Array(1,2);
console.log(arr3); //[1,2]

let arr5=new Array(3)
console.log(arr5); //(3) [空属性 × 3] 其中length=3

let arr6=Array.of(1,2,3)
console.log(arr6);//[1]

let arr7=Array.of(1)
console.log(arr7);//[1] 其中1 是数组的一个元素

let arr8=Array.of(1,true,"zzzzz",[1,2,3],{
    name:"sssss"
})

console.log(arr8);

// 4. fill()
let arr9=new Array(3).fill(10);
console.log(arr9); //10,10,10

let arr10=[1,2,3,4,5];
arr10.fill("zzzzz",1,2);//"zzzzz" 内容 “1” 开始的下标 “0” 结束的下标
console.log(arr10); // [1, 'zzzzz', 3, 4, 5]

// 5.includes()

let arr11=[1,2,3,NaN];
// NaN=Not a Number
console.log(arr11.indexOf(NaN)); //-1

console.log(arr11.includes(NaN)); //true

